home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / doom / ldhe-src.0 / ldhe-src / dehacked / source / vga_graphics.cc < prev    next >
C/C++ Source or Header  |  1995-04-15  |  5KB  |  226 lines

  1.  
  2. // This module only runs under Linux.
  3. #if defined(HAVE_VGA) && defined(linux)
  4.  
  5. /* This module handles all the VGA functions, for text mode switching,
  6.    font loading, etc.
  7. */
  8. #include <sys/types.h>
  9. #include <linux/vt.h>
  10. #include <sys/ioctl.h>
  11. #include <termio.h>
  12. #include <stdio.h>
  13.  
  14. #include "graphics.h"
  15.  
  16. #include "8x8font.h"
  17.  
  18. #ifdef LOAD_REGISTERS
  19. #include "50L_regs.h"
  20. #endif
  21.  
  22. VGA_Graphics:: VGA_Graphics()
  23. {
  24.     keyboard = new TTY_Keyboard;
  25.  
  26.     /* Find out how big the console is */
  27.     detect_vtsize(&saved_cols, &saved_rows);
  28.     if ( saved_rows == 50 )
  29.         lastmode=mode=TEXT50;
  30.     else
  31.         lastmode=mode=TEXT25;
  32.     new_rows=saved_rows;
  33.     new_cols=saved_cols;
  34.  
  35.     /* Okay, we're in a console, initialize 50-line mode */
  36.     vga_disabledriverreport();
  37.     vga_setchipset(VGA);        /* avoid SVGA detection */
  38.     vga_init();
  39.     vga_setmode(TEXT);
  40.     vga_gettextfont(saved_font);
  41.     vga_gettextmoderegs(saved_regs);
  42.     memcpy(new_regs, saved_regs, MAX_REGS);
  43.     if ( saved_rows != 50 ) {
  44.         new_rows=50; new_cols=80;
  45. #ifdef LOAD_REGISTERS
  46.         memcpy(new_regs, reg_data, sizeof(reg_data));
  47. #else
  48.         to_50lines(new_regs);
  49. #endif
  50.     }
  51.     // Initialize IBM Graphics
  52.     printf("\033(U"); fflush(stdout);
  53. }
  54.  
  55. virtual
  56. VGA_Graphics:: ~VGA_Graphics()
  57. {
  58.     if ( mode != TEXT25 )
  59.         set_grmode(TEXT25);
  60.  
  61.     // End IBM Graphics
  62.     printf("\033(B"); fflush(stdout);
  63. }
  64.  
  65. virtual void 
  66. VGA_Graphics:: flush(void)
  67. {
  68.     if ( mode == GRAPHICS )
  69.         gl_copyscreen(Screen);
  70.     fflush(stdout);
  71. }
  72.  
  73. virtual int
  74. VGA_Graphics:: has_graphics(void)
  75. {
  76.     return(1);
  77. }
  78.  
  79. virtual int
  80. VGA_Graphics:: ibm_charset(void)
  81. {
  82.     return(1);
  83. }
  84.  
  85. virtual void 
  86. VGA_Graphics:: set_grmode(int newmode)
  87. {
  88.   checkmode:
  89.     switch (newmode) {
  90.         case TEXT25:    if ( mode == TEXT25 )
  91.                     break;
  92.                 if ( (mode == TEXT50) && (saved_rows == 50) )
  93.                     break;
  94.                 vga_settextmoderegs(saved_regs);
  95.                 vga_puttextfont(saved_font);
  96.                 vga_setmode(TEXT);
  97.                 resize_vt(saved_cols, saved_rows);
  98.                 keyboard->raw(keyboard->getstate());
  99.                 break;
  100.         case TEXT50:    if ( mode == TEXT50 )
  101.                     break;
  102.                 vga_settextmoderegs(new_regs);
  103.                 vga_puttextfont(font_data);
  104.                 vga_setmode(TEXT);
  105.                 resize_vt(new_cols, new_rows);
  106.                 keyboard->raw(keyboard->getstate());
  107.                 break;
  108.         case GRAPHICS:    if ( mode == GRAPHICS ) {
  109.                     clr_grscreen();
  110.                     break;
  111.                 }
  112.                 /* Set the video into graphics mode */
  113.                 vga_setmode(G320x200x256);
  114.                 /* Get the context for the virtual screen */
  115.                 gl_setcontextvgavirtual(G320x200x256);
  116.                 Virtual = gl_allocatecontext();
  117.                 gl_getcontext(Virtual);
  118.                 /* Get the context for the real screen */
  119.                 gl_setcontextvga(G320x200x256);
  120.                 Screen = gl_allocatecontext();
  121.                 gl_getcontext(Screen);
  122.                 // Now switch to the virtual context...
  123.                 gl_setcontext(Virtual);
  124.                 break;
  125.         case LASTMODE:    // Switch to the previous mode.
  126.                 if ( lastmode == GRAPHICS )  {
  127.                     // Free graphics mode stuff...
  128.                     gl_freecontext(Virtual);
  129.                     gl_freecontext(Screen);
  130.                 }
  131.                 newmode=lastmode;
  132.                 goto checkmode;
  133.                 break;
  134.         default:    // Huh? 
  135.                 fprintf(stderr,
  136.             "Unknown graphics mode: 0x%.2x\n", newmode);
  137.                 return;
  138.     }
  139.     lastmode=mode;
  140.     mode=newmode;
  141. }
  142.  
  143. virtual void 
  144. VGA_Graphics:: set_colormap(struct color colormap[256])
  145. {
  146.     for ( int i=0; i<256; ++i ) {
  147.         gl_setpalettecolor(i, colormap[i].red/4,
  148.                 colormap[i].green/4, colormap[i].blue/4);
  149.     }
  150. }
  151.  
  152. virtual void 
  153. VGA_Graphics:: clr_grscreen(void)
  154. {
  155.     int row, col;
  156.  
  157.     for ( row=0; row < 200; ++row ) {
  158.         for ( col=0; col < 320; ++col ) {
  159.             gl_setpixelrgb(col, row, 0, 0, 0);
  160.         }
  161.     }
  162. }
  163.  
  164. virtual void 
  165. VGA_Graphics:: put_graphics_txt(int x, int y, char *string, unsigned char color)
  166. {
  167.     unsigned char font8x8[256 * 8 * 8 * BYTESPERPIXEL];
  168.     gl_setwritemode(WRITEMODE_MASKED);
  169.     gl_expandfont(8, 8, color, gl_font8x8, font8x8);
  170.     gl_setfont(8, 8, font8x8);
  171.     gl_write(x, y, string);
  172. }
  173.  
  174. virtual void
  175. VGA_Graphics:: drawpoint(int x, int y, unsigned char color)
  176. {
  177.     gl_setpixel(x, y, color);
  178. }
  179.  
  180. void 
  181. VGA_Graphics:: detect_vtsize(int *cols, int *rows)
  182. {
  183.     struct winsize win;
  184.  
  185.     if ( ioctl(0, TIOCGWINSZ, &win) < 0 ) {
  186.         *cols=0; *rows=0;
  187.         return;
  188.     }
  189.     *cols = win.ws_col;
  190.     *rows = win.ws_row;
  191. }
  192.  
  193. int 
  194. VGA_Graphics:: resize_vt(int cols, int rows)
  195. {
  196.     struct vt_sizes vtsize;
  197.  
  198.     vtsize.v_cols = cols;
  199.     vtsize.v_rows = rows;
  200.     vtsize.v_scrollsize = 0;
  201.  
  202.     return(ioctl(0, VT_RESIZE, &vtsize));
  203. }
  204.  
  205. void 
  206. VGA_Graphics:: to_50lines(char *regs)
  207. {
  208.     regs[9]  = 0x47;
  209.     regs[10] = 0x06;
  210.     regs[11] = 0x07;
  211.     regs[12] = 0x00;
  212.     regs[13] = 0x00;
  213. }
  214.  
  215. void 
  216. VGA_Graphics:: to_25lines(char *regs)
  217. {
  218.     regs[9]  = 0x4F;
  219.     regs[10] = 0x0D;
  220.     regs[11] = 0x0E;
  221.     regs[12] = 0x03;
  222.     regs[13] = 0x70;
  223. }
  224.  
  225. #endif /* linux */
  226.